// from : http://coolshell.cn/articles/3738.html

#include <iostream>

template < int N, int C = N - 1 >
struct isPrime
{
	const static bool value = (N % C) ? isPrime< N, C - 1>::value : false;
};

template < int N >
struct isPrime< N, 1 >
{
	const static bool value = true;
};

template <>
struct isPrime< 1 >
{
	const static bool value = false;
};

/*
 * 这是我的方法，，那个blog上面为什么不是这种看来更直观的呢？
 *
template < int MIN, int MAX >
struct printPrime
{
	static inline void print()
	{
		if( isPrime< MIN >::value )
			std::cout << MIN << std::endl;
		printPrime< MIN + 1, MAX >::print();
	}
};

template < int N >
struct printPrime< N, N >
{
	static inline void print()
	{
		if( isPrime< N >::value )
			std::cout << N << std::endl;
	}
};
*/

template < int N, bool IS_PRIME >
struct printIfPrime
{
	static inline void print() {}
};

template < int N >
struct printIfPrime< N, true >
{
	static inline void print() {
		std::cout << N << std::endl;
	}
};

template < int MIN, int MAX >
struct printPrime
{
	static inline void print() {
		printIfPrime< MIN, isPrime< MIN >::value >::print();
		printPrime< MIN + 1, MAX >::print();
	}
};

template < int N >
struct printPrime< N, N >
{
	static inline void print() {
		printIfPrime< N, isPrime< N >::value >::print();
	}
};

int main( int argc, char *argv[] )
{
	printPrime< 1, 100 >::print();
	// std::cout << isPrime< 10 >::value << std::endl;
};
